package cn.imvc.app.models;

import java.awt.image.BufferedImage;
import java.util.List;
import java.util.Map;

import com.github.sd4324530.fastweixin.api.response.GetUserInfoResponse;

import cn.imvc.app.entities.Member;

public interface MemberModel{

	Member get(int id);
	
	/**
	 * 根据登录名查找会员记录member
	 * 判断是否有多个，为不正常数据，返回null
	 * 只有一个，则返回该对象
	 * @param member
	 * @return
	 */
	Member getByLoginname(String loginname);

	/**
	 * 注册提交
	 * @param register
	 * 1.保存会员member
	 * 1.1.验证手机号，密码格式
	 * 1.2.比对图形验证码，短信验证码，比对成功要删除缓存
	 * 1.3.查询loginname是否已存在
	 * 1.4.key2加密密码
	 * 2.保存分销商dealer，默认等级为最低级
	 * 3.保存二级域名domain，默认为memberid
	 * @return
	 */
	Map<String, String> saveRegister(Member register, String messagecode, String domain, String serverName);
	
	Map<String, String> savePcRegister(Member register, String messagecode, String imagecode, String serverName, String key);
	
	Member save(Member member);

	Member update(Member entity);

	void delete(int id);

	void deleteBatch(int[] ids);
	
	/**
	 * 登录名(手机号)密码登陆
	 * @param member
	 * 1.根据登录名判断会员member是否存在
	 * 2.根据member取出key2判断密码加密后跟数据库是否一致
	 * 3.在缓存中加入登陆token，
	 *   key=Md5(loginname+时间戳)
	 *   value=member对象
	 *   放入cookie，时间有效期10分钟
	 * @return
	 */
	Map<String, Object> checkLoginSubmit(Member member);
	
	/**
	 * 更新或添加缓存token里面的member对象
	 * @param member 需要更新的对象
	 * @param token
	 * @return
	 */
	void updateLoginMember(Member member, String token);
	void removeLoginMember(String token);
	
	/**
	 * 检测用户是否登陆
	 * @param token
	 * token，从cookie中取
	 * @return
	 * 已登录，返回member对象
	 * 未登录，返回null
	 */
	boolean checkLogin(String token);
	
	/**
	 * 检测用户是否登陆
	 * @param token
	 * token，从cookie中取
	 * @return
	 * 已登录，返回member对象
	 * 未登录，返回null
	 */
	Member getLoginMember(String token);
	
	/**
	 * 判断用户名是否存在，取出key1
	 * @param loginname
	 * @return
	 */
	Map<String, String> checkLoginname(String loginname);
	
	/**
	 * 发送短信验证码
	 * @param mobile
	 * @param code
	 * @return
	 */
	Map<String, String> sendMessageCode(String mobile);
	
	/**
	 * 发送电子邮件验证码
	 * @param email
	 * @return
	 */
	Map<String, String> sendEmailCode(String email);
	
	/**
	 * 发送验证码
	 * @param loginname
	 * @return
	 */
	Map<String, String> sendCode(String loginname);
	Map<String, String> sendCode(String loginname, String imagecode, String ip, String key);
	
	/**
	 * 校验验证码取key
	 * @param mobile
	 * @param message
	 * @return
	 */
	Map<String, String> checkMCodeForKey(String mobile, String messagecode);
	
	/**
	 * 校验短信验证码
	 * @param code
	 * @param mobile
	 * @return
	 * 验证通过且请求正常提交时删除缓存
	 */
	boolean checkMessageCode(String code, String mobile);
	boolean checkCodeError(String mobile);
	
	/**
	 * 验证邮箱验证码
	 * @param code
	 * @param mobile
	 * @return
	 * 验证通过且请求正常提交时删除缓存
	 */
	boolean checkEmailCode(String code, String email);
	
	/**
	 * 密码重置
	 * @param loginname
	 * @param passwd
	 * @return
	 */
	Map<String, String> saveResetPasswd(String loginname, String passwd, String key1);
	
	/**
	 * 根据邮箱查找
	 * @param email
	 * @return
	 */
	List<Member> findByEmail(String email);
	
	Member findByUnionid(String unionid);
	
	Member findByQqOpenid(String qqOpenid);
	
	/**
	 * 通过微信openid检测手机号是否已经注册
	 * 1.已注册，直接登陆
	 * 2.未注册，注册登录
	 * @param mobile
	 * @return
	 */
	Map<String, String> saveRegLoginSubmit(String mobile, String code, String wxOpenid, GetUserInfoResponse userInfoResponse, String type, String domain, String serverName);

	/**
	 * 获取图形验证码，返回流
	 * @return
	 */
	BufferedImage getImageCode(String key);
	
	/**
	 * 检测注册账号是否有效
	 */
	Map<String, String> checkRegisterLoginname(String loginname);
	
	/**
	 * 验证图形验证码
	 * @param code
	 * @param mobile
	 * @return
	 * 验证通过且请求正常提交时删除缓存
	 */
	boolean checkImageCode(String code, String key);
	
	void newMember(Member member) throws Exception;
	
	/**
	 * 查询我的会员
	 * @param parent
	 * @return
	 */
	List<Member> findByParent(Member parent);
	
	void checkTokenForApp(String token, String app);
}